读取 pdf
使用 pdfplumber
import os
import sys
import pdfplumber # 导入库
dirpath = os.getcwd()
pdffile = os.path.join(dirpath, "DDI0487K_a_a-profile_architecture_reference_manual.pdf")
file_str = ''
with pdfplumber.open(pdffile) as pdf: # 加载 pdf 文件,这一步比较慢
for i in range(1642, 2602): # 指定页码
page = pdf.pages[i]
text = page.extract_text() # 获取当前页面的文本内容,str 类型
tables = page.extract_tables() # 获取当前页面的表格文本,如果有的话是 list
for table in tables:
print(table) # 有的话可以打印表格
pdfplumber 对表格的处理不太好,无边框的也识别不了,文本倒是不错。
设置源
- 在
%HOMEPATH%
目录下新建pip/pip.ini
文件。- 即在
C:\Users[用户名]\AppData\Roaming\pip
目录下 - 使用
pip config set global.index-url 源地址
会在 C:\Users[用户名]\AppData\Roaming\pip建立
pip/pip.ini` 文件
- 即在
- 在 pip.ini 中写入以下代码,设置为阿里云的源:
[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
名称 | 国内python优质仓库源地址 |
---|---|
阿里云 | http://mirrors.aliyun.com/pypi/simple/ |
清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
豆瓣(douban) | http://pypi.douban.com/simple/ |
中国科学技术大学 | http://pypi.mirrors.ustc.edu.cn/simple/ |
中国科技大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
整型转换为 2 进制字节序
def put_byte_code(val):
byte_lenght = 4 # 转换后字节序字节个数
byte_order = 'little' # 'little' 小端,'big' 大端
byte_signed = False # 是否带符号
return val.to_bytes(byte_lenght, byteorder=byte_order, signed=byte_signed)
定义数组
a = [0]*5 # 定义数组,元素个数为 20,元素初始值为 0
b = [{'name':'None'}] * 5 # 定义数组,元素个数为 20,元素初始值为字典(字典有姓名键值对)
print(type(a)) # 显示数组为列表类型
print(len(a)) # 显示数组长度
print(a)
print(b)
输出
<class 'list'>
5
[{12: 2}, {12: 2}, {12: 2}, {12: 2}, {12: 2}]
[{'name': 'None'}, {'name': 'None'}, {'name': 'None'}, {'name': 'None'}, {'name': 'None'}]
需要注意的是,上面定义的 b 数组,它的所有元素都指向的是同一个字典对象。本质上,这种定义方式,是将同一个对象的引用赋值到数组中每个元素中。下面是一个定义数组,然后初始化为不同对象例子:
length = 5 # 定义数组长度
a = [None] * length # 定义数组,即 5 个 none 的列表
i = 0
while i < length:
a[i] = list() # 对每个列表元素赋值为一个单独的列表
i += 1
函数指针
普通方法
直接赋值
def foo(a, b):
return a + b
fp = foo
使用 types 方法
为了创建函数指针,我们可以使用 Python 内置的 types
模块中的 FunctionType
函数。该函数接受三个参数:
- 函数的代码对象
- 全局命名空间
- 局部命名空间
我们可以使用 globals()
函数获取全局命名空间,并传递给FunctionType
函数。以下是创建函数指针的示例代码:
import types
def foo(a, b):
return a + b
fp = types.FunctionType(foo.__code__, globals())
在上述代码中,foo.__code__
表示函数 foo
的代码对象。globals()
函数返回全局命名空间,我们将其传递给 FunctionType
函数以创建函数指针。
lambda 函数
语法
lambda [arg1 [,arg2 ... argn]]:expression
argn
这里的参数与函数的参数列表是一样的expression
表达式中出现的参数需要在 argn 中定义(表达式只能是单行的,只能有一个表达式)
特性
- 匿名的
- 有输入(参数列表),有输出(expression 计算的值)
- 拥有自己的命名空间
lambda x,y:x*y # 函数输入是x和y,输出是它们的积x*y
lambda:none # 函数没有输入参数,输出是None
lambda *args: sum(args) # 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
lambda **kwargs: 1 # 输入是任意键值对参数,输出是1
常见用法
由于 lambda 语法是固定的,其本质上只有一种用法,那就是定义一个 lambda 函数。在实际中,根据这个 lambda 函数应用场景的不同,可以将 lambda 函数的用法扩展为以下几种:
- 将 lambda 函数赋值给一个变量
- 将 lambda 函数赋值给其他函数,从而将其他函数用该 lambda 函数替换
- 将 lambda 函数作为参数传递给其他函数
多线程
threading
import threading # 导入 threading 库
class thread(threading.Thread): # 创建 thread 类继承 threading.Thread
def __init__(self,func,arg):
threading.Thread.__init__(self) # 初始化基类
self.func=func # 设置工作函数
self.arg=arg # 设置参数
self.setDaemon(True) # 设置为守护线程
self.ThreadStop = False # 控制线程运行的变量
def run(self): # 覆盖 run 函数
while self.ThreadStop == False:
self.func(self.arg) # 调用工作函数,传入参数
self.ThreadStop = True # 已经结束
def stop(self): # 覆盖 stop 函数
self.ThreadStop = True # 设置线程结束
worker = thread(func) # 创建工作线程
worker.start() # 启动工作线程